﻿using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Service.Security.Authorization;
using System.Collections.Generic;

namespace Sinacor.Servico.Bovespa.ManutencaoOrdens.BusinessLogic.BusinessRulesValidation
{
    public class ValidadorCancelamentoDetalheOrdem : BaseBusinessRuleValidation<BusinessEntity.Ordem>, IBusinessRuleValidation
    {
        #region Campos

        private Movimento.BusinessEntity.InformacoesMovimento _informacoesMovimento;

        private int PERMISSAO_ORDEM_RETROATIVA = 109288;
        private int ORDEM_ABERTA_VIA_MENSAGERIA = 109402;
        private int EXECUCAO_RETROATIVA = 109291;

        #endregion

        #region Construtor
        public ValidadorCancelamentoDetalheOrdem(Movimento.BusinessEntity.InformacoesMovimento informacoesMovimento)
        {
            this._informacoesMovimento = informacoesMovimento;
        }
        #endregion

        #region Metodos

        public List<Infra.Common.Validation.ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        /// <summary>
        /// Validar PermissaoOrdem Retroativa
        /// </summary>
        private bool ValidarPermissaoOrdemRetroativa()
        {
            bool possuiPermissao = AuthorizationContext.Current.CheckUserAccess("D1SIM", "ORD");

            if (!possuiPermissao)
                base.AddValidationError(PERMISSAO_ORDEM_RETROATIVA);

            return possuiPermissao;
        }

        public void Validate()
        {
            ResourceAccess.ManutencaoOrdens raManutencao = new ResourceAccess.ManutencaoOrdens();

            if (base.EntityToValidate.DataValidade < _informacoesMovimento.DataMovimento)
            {
                this.ValidarPermissaoOrdemRetroativa();
            }
            else
            {
                if (raManutencao.VerificarOrdemAbertaViaMensageria(base.EntityToValidate))
                    base.AddValidationError(ORDEM_ABERTA_VIA_MENSAGERIA);
            }

            if (base.EntityToValidate.QuantidadeExecutada > 0)
            {
                if (raManutencao.VerificarExecucaoRetroativa(base.EntityToValidate))
                    base.AddValidationError(EXECUCAO_RETROATIVA);
            }
        }

        #endregion

    }//end ValidadorCancelamentoDetalheOrdem

}//end namespace BusinessRulesValidation